package com.own.business.login.core.entity.vo;

import com.own.component.common.util.encrypt.EncryptUtil;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.Optional;

/**
 * AutoLoginTokenModel
 *
 * @param token         申请的token
 * @param client        客户端
 * @param userId        用户id
 * @param effectiveTime 生效的起始时间戳
 * @param timeout       超时时间
 * @author chenxueli
 * @date 2024-03-12 14:00:00
 */
public record AutoLoginTokenModel(
        String token,
        String client,
        Long userId,
        Long effectiveTime,
        Long timeout
) implements Serializable {

    /**
     * 获取加密的文本
     *
     * @param model 加密的对象
     * @return 加密的文本
     */
    public static String encrypt(AutoLoginTokenModel model) {
        return model.toEncryptString();
    }

    /**
     * 获取解密后的文本
     *
     * @param content 加密的文本
     * @return 解密后的对象
     */
    public static Optional<AutoLoginTokenModel> decrypt(String content) {
        try {
            // 解密字符串
            var decryptContent = EncryptUtil.RSA_PUBLIC.decrypt(content);
            var split = decryptContent.split("\\|");
            // 返回结果
            var model = new AutoLoginTokenModel(split[0], split[1], Long.parseLong(split[2]), Long.parseLong(split[3]), Long.parseLong(split[4]));
            return model.check() ? Optional.of(model) : Optional.empty();
        } catch (Exception e) {
            return Optional.empty();
        }
    }

    /**
     * 检查是否有效
     *
     * @return 是否有效
     */
    public boolean check() {
        return StringUtils.isNotBlank(token)
                && StringUtils.isNotBlank(client)
                && userId != null
                && effectiveTime != null
                && timeout != null;
    }

    /**
     * 获取加密的文本
     *
     * @return 加密的文本
     */
    public String toEncryptString() {
        var flag = check();
        if (!flag) {
            throw new IllegalArgumentException("AutoLoginTokenModel is not valid");
        }
        var content = token + "|" + client + "|" + userId + "|" + effectiveTime + "|" + timeout;
        return EncryptUtil.RSA_PUBLIC.encrypt(content);
    }

}
